package com.hqyj.freemovie.front.controller;

import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.hqyj.freemovie.front.domain.Users;
import com.hqyj.freemovie.front.json.R;
import com.hqyj.freemovie.front.service.UsersService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("users")
public class UsersController extends BaseController {

    @Resource
    private UsersService usersService;

    @GetMapping("auth")
    public R login(HttpServletRequest request, @RequestParam("identify") String identify, @RequestParam("password") String password, @RequestParam("code") String randomCode, @RequestParam("token") String token,@RequestParam("rememberme") String rememberme) {
        Users loginSuccessUser = null;
        System.out.println("客户端的令牌： " + token + ",验证码：" + randomCode);
        System.out.println("用户是否选择了记住我："+rememberme);

        try {
            //首先要检查验证码
            if(!redisUtil.hasKey(token)){
                //
                return R.fail("验证码验证失败！");
            }

            String applicationRandomCode = (String)redisUtil.get(token);
            if(!randomCode.equalsIgnoreCase(applicationRandomCode)){
                return R.fail("验证码验证失败！");
            }

            if ((loginSuccessUser = usersService.login(identify, password)) != null) {

                //这里使用sa-token保存登录成功的用户状态。
                //StpUtil.login(loginSuccessUser.getUid());

                //用户如果选择了记住我，后端的用户登录状态的保存时间和前端保持一致。也保存100天
                StpUtil.login(loginSuccessUser.getUid(), new SaLoginModel().setTimeout(60 * 60 * 24 * 100));
                //服务器已经生成一个令牌。
                //必须要返回给客户端。客户端必须获取这个令牌，保存起来。
                SaTokenInfo tokenInfo =StpUtil.getTokenInfo(); //会员卡的信息。
                loginSuccessUser.setTokenName(tokenInfo.getTokenName()); //"洗浴中心的名字"
                loginSuccessUser.setTokenValue(tokenInfo.getTokenValue()); //"会员卡号"

                //等登录成功之后，必须检查登录成功的用户是不是管理员角色。
                //我怎么检查你是不是管理员。
                if(StpUtil.hasRole("admin")){
                    loginSuccessUser.setPassword("");
                    loginSuccessUser.setPermissions(StpUtil.getPermissionList());
                    return R.success("登录成功！", loginSuccessUser);
                }
                return R.fail("登录失败,请检查用户名或者密码是否正确！");
            }
            return R.fail("登录失败，请检查用户名或者密码是否正确！");
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    // 查询登录状态，浏览器访问： http://localhost:8081/user/isLogin
    @GetMapping("isLogin")
    public R isLogin() {
       try {
           return R.success("获得登录状态成功", StpUtil.isLogin()); //true 表示已登录，false 未登录
       }catch(Exception ex){
           ex.printStackTrace();
           return R.error("程序出现异常！");
       }
    }


    @GetMapping("/logout")
    public R logout(){
        try{
            StpUtil.logout(); //服务器已经把用户的登录状态删除了....
            return R.success("注销成功！");
        }catch(Exception ex){
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    @PostMapping("/")
    public R reg(@RequestBody Users u) {
        try {
            if (usersService.reg(u)) {
                return R.success("注册成功！");
            }
            return R.fail("注册失败！");
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    @GetMapping("/isReg")
    public R mobileIsReg(@RequestParam("mobile") String mobile){
        try{
           boolean flag =  usersService.checkMobileIsReg(mobile);
           return R.success("检查手机注册状态信息成功！",flag);
        }catch (Exception ex){
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }
}
